package com.dys.testjdk10;

import java.util.ArrayList;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
 * @className: com.dys.testjdk10.VarTest
 * @description: Java10增加局部变量类型推断的功能
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/09/04 下午10:22
 */
public class VarTest {
    // 成员变量不能使用类型推断
    // var name="小明";

    /**
     * 局部变量类型推断
     */
    private static void testVar() {
        // 局部变量,根据所赋的值,推断变量的类型
        var num = 10;
        var arrayList = new ArrayList<String>();
        arrayList.add("张三");
        arrayList.add("李四");
        // 遍历操作
        for (var s : arrayList) {
            System.out.println(s);
            System.out.println(s.getClass());
        }
        // 普通的遍历操作
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println(i);
        }
        // 推断类型的变量操作
        for (var i = 0; i < arrayList.size(); i++) {
            System.out.println(i);
        }
        Supplier<Double> supplier = () -> Math.random();

    }

    /**
     * 不可以使用局部变量类型推断的情况
     */
    private static void testNotVar() {
        // 根据右边的数据推断类型,不赋值压根没给推断的机会,这是错的
        // var name;
        // null值无法推断数据类型,这是不能使用类型推断
        // var str = null;
        Supplier<Double> supplier = () -> Math.random();
        // 这是不OK的 lambda表达式需要显式数据类型,不然无法明确是哪个接口
        // var supplier2=()->Math.random();
        // 这是可以的进行方法引用的
        Consumer<String> consumer = System.out::println;
        // 这是不可以的,无法明确接口类型
        // var consumer2=System.out::println;
        // 动态初始化数据可以进行类型推断
        var arr = new String[10];
        // 静态初始化数组不可以使用类型推断
        // var arr2 ={"asdf","qwer","zxcv","tyui","ghjk"};
        // 情况1 没有初始化的局部变量声明
        // var s; var x=null;
        // 情况2 方法的返回值类型
        // public var test1();
        // 情况3 方法的参数类型
        // public void test2(var a,var b);
        // 情况4 构造器的参数类型
        // public Person(var name,var age)
        // 情况6 catch块
        // try{
        // }catch(var e){
        // }

    }
}

class Person {
    // 情况5 属性
    // var name;
}
